package com.agu.common.aop;

import java.lang.reflect.Method;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.agu.common.annotation.SysLog;
import com.agu.entity.sys.SysLogEntity;
import com.agu.entity.sys.SysUserEntity;
import com.agu.mgt.sys.service.SysLogService;
import com.agu.result.Result;
import com.agu.utils.HttpContextUtils;
import com.agu.utils.IPUtils;
import com.agu.utils.ShiroUtils;
import com.alibaba.fastjson.JSON;

/**
 * 系统日志，切面处理类
 * 
 */
@Aspect
@Component
public class SysLogAspect {

	@Autowired
	private SysLogService sysLogService;

	// 定义Pointcut，Pointcut的名称 就是simplePointcut，此方法不能有返回值，该方法只是一个标示
	// @annotation 指定自定义注解
	@Pointcut("@annotation(com.agu.common.annotation.SysLog)")
	public void logPointCut() {

	}

	//@Before("logPointCut()")
	public void saveSysLog(JoinPoint joinPoint) {
		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
		Method method = signature.getMethod();

		SysLogEntity sysLog = new SysLogEntity();
		SysLog syslog = method.getAnnotation(SysLog.class);
		if (syslog != null) {
			// 注解上的描述
			sysLog.setOperation(syslog.value());
		}

		// 请求的方法名
		String className = joinPoint.getTarget().getClass().getName();
		String methodName = signature.getName();
		sysLog.setMethod(className + "." + methodName + "()");

		// 请求的参数
		Object[] args = joinPoint.getArgs();
		String params = JSON.toJSONString(args[0]);
		sysLog.setParams(params);

		// 获取request
		HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
		// 设置IP地址
		sysLog.setIp(IPUtils.getIpAddr(request));

		// 用户名
		String username = ShiroUtils.getUserEntity().getUserName();
		sysLog.setUsername(username);

		sysLog.setCreateDate(new Date());
		// 保存系统日志
		sysLogService.save(sysLog);
	}

	@AfterReturning(value = "logPointCut()", returning = "res")
	public void doAfterReturningAdvice1(JoinPoint joinPoint, Object res) {
		MethodSignature signature = (MethodSignature) joinPoint.getSignature();
		Method method = signature.getMethod();

		SysLogEntity sysLog = new SysLogEntity();
		SysLog syslog = method.getAnnotation(SysLog.class);
		if (syslog != null) {
			// 注解上的描述
			sysLog.setOperation(syslog.value());
		}

		// 请求的方法名
		String className = joinPoint.getTarget().getClass().getName();
		String methodName = signature.getName();
		sysLog.setMethod(className + "." + methodName + "()");

		// 请求的参数
		Object[] args = joinPoint.getArgs();
		
		if(args.length>0)
		{
			try {
				String params = JSON.toJSONString(args[0]);
				sysLog.setParams(params);
			} catch (Exception e) {
				// TODO: handle exception
			}
		}


		// 获取request
		HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
		// 设置IP地址
		sysLog.setIp(IPUtils.getIpAddr(request));

		// 用户名
		SysUserEntity  sysUserEntity= ShiroUtils.getUserEntity();
		
		// 用户名
		String username = "匿名";
		
		if(sysUserEntity!=null) {
			username = sysUserEntity.getUserName();
		}
		sysLog.setUsername(username);
		
		sysLog.setCreateDate(new Date(System.currentTimeMillis()));
		
		
		if (res instanceof Result) {
			
			Result resultVO = (Result) res;
			
			if(resultVO.getCode() ==0)
			{
				sysLog.setStauts(0);
				sysLog.setMessage(resultVO.getMessage());
				sysLog.setRemark(resultVO.getRemark());
			}else {
				sysLog.setStauts(1);
				sysLog.setMessage(resultVO.getMessage());
				sysLog.setRemark(resultVO.getRemark());
			}
			
		}
		
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				// 保存系统日志
				sysLogService.save(sysLog);
			}
		});
		t1.start();

	}
}
